#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include "read_txt.h"

/*
2017/8/22:	1.发现alpha的长度与样本长度有关，是否应该用数据去初始化分类器还是直接剔除掉比较好
		  	2.发现书上的好像都是单个值的样本，说不定alpha是个矩阵
2017/8/25:	1.确定使用SMO算法，不需要在设置梯度
			2.新增SMO_Pram结构实现SMO
			3.新增g(xi)等基础函数
			4.问题：int能表示的索引可能有限，需要全部改成long int
2017/8/26:	1.已经处理完成 long int问题
*/

typedef struct {
	double weight[4125];//权值向量，这是因为我知道变量到底有多少个4125个变量
	int weight_length;//权值长度
	double Constant_B;//齐次量
	double Constant_C;//alpha值上限
}svm_classifier;//分类器数据结构

typedef struct {
	double *alpha;
	double *E;
	double *b;
	int length;
	double c;
}SMO_Pram;


//分类器基本操作
svm_classifier* svm_classifier_Create(float c=0.1);//创建

SMO_Pram* SMO_classisifier_Create(input_data *DList,float c=0.1);//smo数据结构创建

//对偶函数，需要最小化
double Dual_Loss_Function(svm_classifier *classifier, input_data *Dlist);

double SMO_LossFunction(SMO_Pram *smo,input_data *Dlist);//对偶函数

int SMO_Algorithm(SMO_Pram *smo,input_data *Dlist);
int SMO_CheckKKT(SMO_Pram *smo,input_data *Dlist,double eps);//检查全局KKT条件，不满足返回1，满足返回-1
long int SMO_OuterIndex(SMO_Pram *smo, input_data *Dlist, double eps, long int startindex = 0);//外层循环，返回第一个索引
long int SMO_InnerIndex(SMO_Pram *smo,long int outerindex);//内层循环，返回第二个索引
double SMO_gFunction(SMO_Pram *smo,input_data *Dlist,long int index);//计算G值
double SMO_DotProduct(input_data *Dlist,long int index1,long int index2);//计算内积，以后会添加方法
